// utils/auth.js
import store from '@/store';
import {
	refreshToken
} from 'apis/user.js';
import {
	decode as base64Decode
} from 'base64-arraybuffer';


export function hasPermission(requiredPermissions) {
	const userPermissions = state.userInfo.permissions || [];

	// 使用 some() 方法检查用户权限是否包含在所需权限中
	return requiredPermissions.some(permission => userPermissions.includes(permission));
}

export function checkPageAccess(requiredPermissions, redirectUrl) {
	if (!hasPermission(requiredPermissions)) {
		uni.showToast({
			title: '您没有权限访问此页面',
			icon: 'none'
		});
		uni.redirectTo({
			url: redirectUrl || '/pages/home/home'
		});
	}
}

// 判断当前是否登录
export function isLogin() {
	const authToken = uni.getStorageSync('authToken')
	
	// 无token直接返回false
	if (!authToken?.token) return false;

	// 判断当前token是否过期
	if (authToken.refresh && isTokenExpired(authToken)) {
		// 过期了,请求刷新接口
		let refresh = authToken.refresh
		refreshToken(JSON.stringify(refresh)).then(res => {
			authToken.refresh = res.refresh_token
			authToken.token = res.access_token
			if (authToken.token) {
				store.commit('setAuthToken', authToken)
				return true
			}
			return false
		}, err => {
			if (err.data.code == 401) {
				return false

			}
		})
	} else {
		if (authToken.token) {
			store.commit('setAuthToken', authToken)
			return true
		}
		return false
	}
}

// 判断 token 是否过期（兼容所有平台）
export function isTokenExpired(authToken) {
	const token = authToken?.token;
	if (!token) return true;

	try {
		// 获取 payload 部分
		const payloadBase64 = token.split('.')[1];
		if (!payloadBase64) return true;

		// 处理 URL 安全的 Base64 编码（替换 - 和 _ 为 + 和 /）
		const base64 = payloadBase64
			.replace(/-/g, '+')
			.replace(/_/g, '/');

		// 补全 Base64 填充字符（=）
		const padding = '='.repeat((4 - (base64.length % 4)) % 4);
		const paddedBase64 = base64 + padding;

		// 使用 base64-arraybuffer 解码成 ArrayBuffer
		const decodedArrayBuffer = base64Decode(paddedBase64);

		// 兼容小程序的 ArrayBuffer -> UTF-8 字符串转换
		const decodedString = arrayBufferToString(decodedArrayBuffer);

		// 解析 JSON 数据
		const decodedPayload = JSON.parse(decodedString);
		const currentTime = Math.floor(Date.now() / 1000); // 当前时间戳（秒）

		return decodedPayload.exp < currentTime;
	} catch (e) {
		console.error('解析 token 失败:', e);
		return true; // 解析失败也视为无效或过期
	}
}

// 兼容所有平台的 ArrayBuffer 转字符串函数
function arrayBufferToString(buffer) {
	const dataView = new Uint8Array(buffer);
	let str = '';
	for (let i = 0; i < dataView.length; i++) {
		str += String.fromCharCode(dataView[i]);
	}
	// 处理中文等字符
	return decodeURIComponent(escape(str));
}